bitkeeper revision 1.1236.1.107 (423fe7a68FOsyuQeKM4k2_0KKlkoEg)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 22 Mar 2005 09:38:46 +0000 (09:38 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 22 Mar 2005 09:38:46 +0000 (09:38 +0000)
Calling alloc_boot_pages() after end_boot_allocator() can result in
double allocation of the same page.
Signed-off-by: Chengyuan Li <chengyuan.li@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/x86_64/mm.c

index 68f79f77ccdf39097e7f23ef4135ab507d607c54..d0717bfab73d2ec1fc0b2ebbddca2dbddd87b77f 100644 (file)
 #include <asm/fixmap.h>
 #include <asm/msr.h>
 
-void *safe_page_alloc(void)
+static void *safe_page_alloc(void)
 {
     extern int early_boot;
     if ( early_boot )
-        return __va(alloc_boot_pages(PAGE_SIZE, PAGE_SIZE));
-    return (void *)alloc_xenheap_page();
+    {
+        unsigned long p = alloc_boot_pages(PAGE_SIZE, PAGE_SIZE);
+        if ( p == 0 )
+            goto oom;
+        return phys_to_virt(p);
+    }
+    else
+    {
+        struct pfn_info *pg = alloc_domheap_page(NULL);
+        if ( pg == NULL )
+            goto oom;
+        return page_to_virt(pg);
+    }
+ oom:
+    panic("Out of memory");
+    return NULL;
 }
 
 /* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */
@@ -118,6 +132,7 @@ void __init paging_init(void)
 {
     unsigned long i, p, max;
     l3_pgentry_t *l3rw, *l3ro;
+    struct pfn_info *pg;
 
     /* Map all of physical memory. */
     max = ((max_page + L1_PAGETABLE_ENTRIES - 1) & 
@@ -130,10 +145,11 @@ void __init paging_init(void)
      */
     for ( i = 0; i < max_page; i += ((1UL << L2_PAGETABLE_SHIFT) / 8) )
     {
-        p = alloc_boot_pages(1UL << L2_PAGETABLE_SHIFT,
-                             1UL << L2_PAGETABLE_SHIFT);
-        if ( p == 0 )
+        pg = alloc_domheap_pages(
+            NULL, L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT);
+        if ( pg == NULL )
             panic("Not enough memory for m2p table\n");
+        p = page_to_phys(pg);
         map_pages(idle_pg_table, RDWR_MPT_VIRT_START + i*8, p, 
                   1UL << L2_PAGETABLE_SHIFT, PAGE_HYPERVISOR | _PAGE_USER);
         memset((void *)(RDWR_MPT_VIRT_START + i*8), 0x55,